package main

import (
	"encoding/json"
	"fmt"
	"strconv"
)

//结构体的名称和字段的名称大小写遵循方法和变量的规律
type User struct{
	Name string `json:"name"`	//如果属性名称小写，其他包访问不到；如果大写，返回的json为大写，不利于数据传输
	Age int `json:"age"`
	Pwd string `json:"skill"`
}
//结构体内部方法 只能由结构体变量调用
func (u User) printUserMessage(){	//值传递，内部对user修改不影响外部user
	fmt.Printf("name=%v,age=%v,pwd=%v\n",u.Name,u.Age,u.Pwd)
}
func (u *User) printUserMessage2(){		//引用传递，内部对user值修改会影响到外部user
	fmt.Printf("name=%v,age=%v,pwd=%v\n",(*u).Name,(*u).Age,(*u).Pwd)
}
func (u *User) String()string{	//结构体定义了String方法类似于Java类中的toString方法 fmt.Println(&user)会调用该方法
	return "name="+u.Name+" age="+strconv.FormatInt(int64(u.Age),10)+" pwd="+u.Pwd
}


//结构体的初始化
func initStruct(){
	//初始化  
	var user1 User = User{"张三",18,"111111"}
	fmt.Println(user1)
	fmt.Println(user1.Name)

	//使用指针
	var user2 *User = new(User)
	//使用指针给结构体赋值时，可以不加*
	//等价于 user2.name = "李四"
	(*user2).Name = "李四"
	(*user2).Age = 19
	(*user2).Pwd = "333333"
	fmt.Println(*user2)

	var user3 *User = &User{"王五",20,"444444"}
	fmt.Println(*user3)
}

//结构体转json
func jsonStruct(){
	var user1 User = User{"陈晨",19,"555555"}
	jsonStr ,err := json.Marshal(user1)
		if(err!=nil){
			fmt.Println(err)
		}
		fmt.Println(string(jsonStr))
}

func method(){
	var user User = User{"qqq",11,"777"}
	user.printUserMessage()
	(&user) .printUserMessage2()	//引用传递时可以省去user前的取地址符
	fmt.Println(&user)	//为了区别是否使用String方法打印变量的值，看传入的参数是值传递还是引用传递
}

func main(){
	initStruct()
	fmt.Println("-------------------------------")
	jsonStruct()
	fmt.Println("-------------------------------")
	method()
	fmt.Println("-------------------------------")
}